package chapter06;

import java.util.HashMap;
import java.util.LinkedHashMap;

/**
 * 功能: 测试HashMap的源码.
 * 1、put的流程：初始化--->计算数组中位置--->直接插入？--->相等替换？--->是TreeNode？--->尾插法插入链表--->resize扩容？（HashMap可能造成白白扩容一次）
 * 2、resize流程：计算好新容量--->处置原来的节点（细节：单节点直接设置--->TreeNode走TreeNode流程--->链表是重点：用hash按bit位重新计算位置）
 * 3、get流程：跟put基本一样
 *
 * LinkedHashMap
 *      答：是HashMap的子类，比HashMap的Node节点多2个属性（before、after），这就是link的原理
 * TreeMap
 *      答： 有比较器，如果比较后相等就替换，否则就递归判断节点的位置
 * @author Fire Fish
 * @since 2022-08-03 8:49 PM
 */
public class HashMapTest {
    public static void main(String[] args) {

    }

    /**
     * 注意：linkedHashMap继承HashMap，它的节点比HashMap节点多2个属性【before、after】
     */
    private static void linkedHashMapTest() {
        HashMap<String, Integer> aHashMap = new LinkedHashMap<>();
        aHashMap.put("342", 1);
        aHashMap.put("zdag23", 3);
        aHashMap.put("sdfs", 4);
        System.out.println(aHashMap);
    }

    private static void hashMapTest() {
        HashMap<A, Integer> aHashMap = new HashMap<>();
        aHashMap.put(new A(3), 3);
        aHashMap.put(new A(3), 4);
        System.out.println(aHashMap);
    }

    static class A {
        private int num = 0;

        public A(int num) {
            this.num = num;
        }

        @Override
        public int hashCode() {
            return 4;
//            return Rando;
        }

        @Override
        public boolean equals(Object obj) {
            return false;
        }
    }
}
